import router from "./router";
import { ElMessage, ElMessageBox, ElRadioGroup, ElRadio } from "element-plus";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getToken } from "@/utils/auth";
import { isHttp } from "@/utils/validate";
import { isRelogin } from "@/utils/request";
import useUserStore from "@/store/modules/user";
import useSettingsStore from "@/store/modules/settings";
import usePermissionStore from "@/store/modules/permission";
import useTagsViewStore from "@/store/modules/tagsView";
import { h, ref, createCommentVNode, unref } from "vue";
import XEUtils from "xe-utils";
NProgress.configure({ showSpinner: false });

const whiteList = ["/login", "/auth-redirect", "/bind", "/register"];

router.beforeEach((to: any, from, next) => {
    NProgress.start();
    if (getToken()) {
        to.meta.title && useSettingsStore().setTitle(to.meta.title);
        if (to.path === "/login") {
            next({ path: "/" });
            NProgress.done();
        } else {
            const roleMode = useUserStore().mode;
            if (useUserStore().roles.length === 0) {
                isRelogin.show = true;
                // 判断当前用户是否已拉取完user_info信息
                // prettier-ignore
                useUserStore().getInfo().then(() => {
                        isRelogin.show = false;
                        // prettier-ignore
						usePermissionStore().generateRoutes().then((accessRoutes: any) => {
							// roles权限生成可访问的路由表
                            accessRoutes.forEach((route: any) => {
                                if (!isHttp(route.path)) {
                                     // 动态添加可访问路由表
                                    router.addRoute(route);
                                }
                            });
                             // hack方法 确保addRoutes已完成
							next({ ...to, replace: true });
						});
                        // 获取表格配置
                        
					})
					.catch(async err => {
						await useUserStore().logOut().then(() => {
							ElMessage.error(err);
							next({ path: "/" });
						});
					});
            } else {
                if (roleMode === "multiple") {
                    //多角色选择处理
                    const {
                        meta: { roles },
                    } = to;
                    const selectRole = ref();
                    XEUtils.arrayEach(unref(useTagsViewStore().visitedViews), (item: any) => {
                        if (item.meta["role"] && item.path == to.path) {
                            selectRole.value = item.meta["role"];
                        }
                    });

                    if (selectRole.value) {
                        useUserStore().setRole(selectRole.value);
                        next();
                    } else {
                        if (roles && roles.length > 1) {
                            const radioVNs = <any>[];
                            const checked = ref();
                            XEUtils.arrayEach(roles, (item: any, index: number) => {
                                if (index === 0) {
                                    checked.value = item["roleKey"];
                                }
                                radioVNs.push(h(ElRadio, { label: item["roleKey"] }, [item["roleName"]]));
                            });
                            ElMessageBox({
                                title: "请选择角色",
                                showCancelButton: false,
                                closeOnClickModal: false,
                                closeOnPressEscape: false,
                                showClose: false,
                                draggable: true,
                                message: () =>
                                    h(
                                        ElRadioGroup,
                                        {
                                            modelValue: checked.value,
                                            "onUpdate:modelValue": (value: string) => {
                                                checked.value = value;
                                            },
                                            style: { display: "flex", "flex-wrap": "wrap", "font-size": 0, "flex-direction": "column", "align-items": "start", "margin-left": "6px" },
                                        },
                                        radioVNs && radioVNs.length > 0 ? radioVNs : createCommentVNode()
                                    ),
                                beforeClose: (action, instance, done) => {
                                    XEUtils.arrayEach(roles, (item: any) => {
                                        if (item["roleKey"] === checked.value) {
                                            useUserStore().setRole(item);
                                            to.meta["role"] = item;
                                        }
                                    });
                                    done();
                                },
                                callback: () => {
                                    next();
                                },
                            });
                        } else if (roles && roles.length == 1) {
                            useUserStore().setRole(roles[0]);
                            next();
                        } else {
                            next();
                        }
                    }
                } else {
                    next();
                }
            }
        }
    } else {
        // 没有token
        if (whiteList.indexOf(to.path) !== -1) {
            // 在免登录白名单，直接进入
            next();
        } else {
            next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
            NProgress.done();
        }
    }
});

router.afterEach(() => {
    NProgress.done();
});
